package com.itrus.contract.extension.shardinsphere;

import com.itrus.contract.mapper.ContractMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;



@Slf4j
@Component
public class ShardingDateManager {


    @Resource
    private ContractMapper contractMapper;

//    @Autowired
//    private ContractDataSource contractDataSource;
//    @Autowired
//    private RedisUtil redisUtil;
//    @Autowired
//    private ShardingTableNameManager shardingTableNameManager;


//    public Integer getShardingDateByContractId(Long contractId){
//        String key = RedisTimeConstant.SHARDING_DATE_PREFIX+contractId;
//        Object value = redisUtil.get(key);
//        if (Objects.isNull(value) || !StringUtils.isNumeric(value.toString())){
//            Contract contract = contractMapper.selectById(contractId);
//            if (Objects.nonNull(contract)){
//                Integer shardingDate = contract.getShardingDate();
//                if (Objects.nonNull(shardingDate) && shardingDate > 0){
//                    redisUtil.set(key, shardingDate, RedisTimeConstant.CACHE_1_WEEK);
//                }
//                return ObjectUtils.defaultIfNull(shardingDate,0);
//            }
//        } else {
//            return new BigDecimal(value.toString()).intValue();
//        }
//        return 0;
//    }

//    public Pair<Integer,Integer> queryShardingDateRange(){
//        return queryShardingDateRange(shardingTableNameManager.queryShardingTablesList(contractDataSource.getDatasource()));
//    }

//    public Pair<Integer,Integer> queryShardingDateRange(Map<String, Map<ShardingTableEnum, List<String>>> tableNameMap){
//        List<String> suffixList = new ArrayList<>();
//        for (String k : tableNameMap.keySet()) {
//            suffixList.addAll(tableNameMap.get(k).get(ShardingTableEnum.CONTRACT).stream()
//                    .map(o-> StringUtils.removeStartIgnoreCase(o, ShardingTableEnum.CONTRACT.getTableName()).replaceAll("_",""))
//                    .filter(o->StringUtils.isNotBlank(o)).collect(Collectors.toList()));
//        }
//        Integer maxDate = Integer.parseInt(LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE));
//        Integer minDate = Integer.parseInt(LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE));
//        if (CollectionUtils.isNotEmpty(suffixList)){
//            String min = suffixList.stream().min(String::compareTo).get();
//            String max = suffixList.stream().max(String::compareTo).get();
//            minDate = ShardingDateValueUtil.minFillDateToInt(min, shardingTableNameManager.getTableRules());
//            maxDate = ShardingDateValueUtil.maxFillDateToInt(max, shardingTableNameManager.getTableRules());
//            log.info("分表范围，最小分表:[{}],最大分表:[{}],shardingDate:[{}] ->[{}]",min,max,minDate, maxDate);
////            redisUtil.setStr(RedisTimeConstant.SHARDING_DATE_MIN, String.valueOf(minDate), RedisTimeConstant.CACHE_1_WEEK);
////            redisUtil.setStr(RedisTimeConstant.SHARDING_DATE_MAX, String.valueOf(maxDate), RedisTimeConstant.CACHE_1_WEEK);
//        } else {
//            log.info("未进行分表");
//            Map<String,Object> map = contractMapper.queryMaxMinShardingDate();
//            if (Objects.nonNull(map)){
//                maxDate = Integer.parseInt(map.getOrDefault("MAXDATE",0).toString());
//                minDate = Integer.parseInt(map.getOrDefault("MINDATE",0).toString());
//            }
//        }
//        return Pair.of(minDate, maxDate);
//    }

    /**
     * 分表才需要使用才方法来转换，IllegalStateException: no table route info
     * 返回null，表示范围超出了分表
     * @param beginDate
     * @param endDate
     * @return
     */
//    public Pair<Integer,Integer> convertShardingDate(Integer beginDate, Integer endDate){
//        if (beginDate>endDate){
//            return null;
//        }
//        if (TableRulesEnum.NORMAL.equals(shardingTableNameManager.getTableRules())){
//            return Pair.of(beginDate, endDate);
//        }
//        String max = StringUtils.defaultIfBlank(redisUtil.getStr(RedisTimeConstant.SHARDING_DATE_MAX),"0");
//        String min = StringUtils.defaultIfBlank(redisUtil.getStr(RedisTimeConstant.SHARDING_DATE_MIN),"0");
//        Integer maxDate = Integer.parseInt(max);
//        Integer minDate = Integer.parseInt(min);
//        if (endDate<minDate){
//            return null;
//        }
//        if (beginDate>maxDate){
//            return null;
//        }
//        return Pair.of(Math.max(beginDate,minDate), Math.min(endDate,maxDate));
//    }



}
